package com.jeomo.common.util;

import java.math.BigDecimal;

/**
 * @author:Jackpot
 * @create 2020-09-17 12:05
 * @description:
 */
public class DoubleUtil {

    /**
     * 两个double数相加
     *
     * @param value1
     * @param value2
     * @return
     */
    public static double add(double value1, double value2) {
        BigDecimal bd1 = new BigDecimal(Double.toString(value1));
        BigDecimal bd2 = new BigDecimal(Double.toString(value2));
        return bd1.add(bd2).doubleValue();
    }

    /**
     * 多个double数相加
     *
     * @param value
     * @return
     */
    public static double add(double... value) {
        if (value == null || value.length == 0) {
            return 0;
        }
        if (value.length == 1) {
            return value[0];
        }
        BigDecimal result = toBigdeBigDecimal(value[0]);
        for (int i = 1; i < value.length; i++) {
            BigDecimal temp = toBigdeBigDecimal(value[i]);
            if (result == null) {
                result = temp;
            } else if (temp != null) {
                result = result.add(temp);
            }
        }
        return result.doubleValue();
    }

    /**
     * 转为Bigdecimal
     *
     * @param value
     * @return
     */
    private static BigDecimal toBigdeBigDecimal(Object value) {
        if (value == null) {
            return null;
        }
        if (value instanceof BigDecimal) {
            return (BigDecimal) value;
        }
        if (value instanceof Number || value instanceof String) {
            return new BigDecimal(value.toString());
        }

        throw new RuntimeException("不支持计算的数据类型");
    }
    /**
     * 两个double数相减
     *
     * @param value1
     * @param value2
     * @return
     */
    public static double sub(double value1, double value2) {
        BigDecimal bd1 = new BigDecimal(Double.toString(value1));
        BigDecimal bd2 = new BigDecimal(Double.toString(value2));
        return bd1.subtract(bd2).doubleValue();
    }

    /**
     * 两个double数相乘
     *
     * @param value1
     * @param value2
     * @return
     */
    public static double mul(double value1, double value2) {
        BigDecimal bd1 = new BigDecimal(Double.toString(value1));
        BigDecimal bd2 = new BigDecimal(Double.toString(value2));
        return bd1.multiply(bd2).doubleValue();
    }

    /**
     * 多个double数相乘
     *
     * @param value
     * @return
     */
    public static double mul(double... value) {
        if (value == null || value.length == 0) {
            return 0;
        }
        if (value.length == 1) {
            return value[0];
        }
        BigDecimal temp = new BigDecimal(String.valueOf(value[0]));
        for (int i = 1; i < value.length; i++) {
            temp = temp.multiply(new BigDecimal(String.valueOf(value[i])));
        }
        return temp.doubleValue();
    }

    /**
     * 两个double数相除
     *
     * @param value1 除数
     * @param value2 被除数（不能为0）
     * @param scale 保留小数位数 （不能小于0）
     * @return
     */
    public static double div(double value1, double value2, int scale) {
        if (scale < 0) {
            throw new IllegalArgumentException("保留小数位数必须大于或等于0");
        }
        if (value2 == 0) {
            throw new IllegalArgumentException("被除数不能为0");
        }
        BigDecimal bd1 = new BigDecimal(Double.toString(value1));
        BigDecimal bd2 = new BigDecimal(Double.toString(value2));
        return bd1.divide(bd2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
    }

    /**
     * 四舍五入,保留两位小数
     * @param value
     * @return
     */
    public static double round(double value) {
        BigDecimal bg = new BigDecimal(Double.toString(value));
        return bg.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
    }
}
